package leetcode_41_60;

import java.util.ArrayList;
import java.util.List;

public class spiralOrder_54 {
    /**
     *  m 行 n 列的矩阵 matrix ，按照 顺时针螺旋顺序 ，返回矩阵中的所有元素
     * @param matrix
     * @return
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        /*
        设定上下左右边界
        每次循环都为先进行，行添加，再进行列添加，用一个布尔值判断此时进行的是正向还是逆向，降低代码冗余
        先从左往右，此时第一行因为已经使用过了，可以将其从图中删去，体现在代码中就是重新定义上边界
        再从上往下，同理删去最后一列
        判断若重新定义后，上下边界交错，表明螺旋矩阵遍历结束，跳出循环，返回答案
        不断循环以上步骤，直到某两条边界交错，跳出循环，返回答案
         */
        List<Integer> ans = new ArrayList<>();
        // 第0行和最后一行
        int rowUp = 0, rowDown = matrix.length - 1;
        // 第0列和最后一列
        int colUp = 0, colDowm = matrix[0].length - 1;
        // 定义从上到下和从左到右的遍历顺序为正序，order为true
        boolean order = true;

        while(rowUp <= rowDown && colUp <= colDowm){  //边界交错
            if(order){
                // 从左往右
                for (int i = colUp; i <= colDowm; i++) {
                    ans.add(matrix[rowUp][i]);
                }
                rowUp++;   //删去此时的第一行
                // 从上往下
                for (int i = rowUp; i <= rowDown; i++) {
                    ans.add(matrix[i][colDowm]);
                }
                colDowm--; //删去此时的最后一列
                order = false;
            }
            else{
                // 从右往左
                for (int i = colDowm; i >= colUp; i--) {
                    ans.add(matrix[rowDown][i]);
                }
                rowDown--;//删去此时的最后一行
                // 从下往上
                for (int i = rowDown; i >= rowUp; i--) {
                    ans.add(matrix[i][colUp]);
                }
                colUp++;//删去此时的第一列
                order = true;
            }
        }
        return ans;
    }
}
